package Servidor;

import java.util.HashMap;
import java.util.Map;

public class Server {
	//en esta estructura se guarda todos los servicios disponibles, 
	//para verificar si un metodo se encuentra en esta estrucuta, 
	//basta con pasarle el nombre del metodo("string") y si lo que retorna es diferente de 
	//null ps si existe, adicionalmente se pueden comparar el numero de parametros
	private Map<String,ServerService> services= new HashMap<String,ServerService>();
	private boolean error; // contiene si 
	private int id=0;// es el id del metodo(se usa para el metodo addService)
	private int resultado;// aca se almacena el resultado, como solo estamos trabajando con enteros
	// se hace de esta forma pero
	// si se quiere trabajar con mas datos ps "resultado" podria ser una clase aparte que tenga
	// de miembros los tipos soportados.
	
	public Server(){
		this.id=0;
		this.services.clear();
		this.resultado=0;
		this.error=false;
	}
	
	// aca se añaden los servicios que la clase test server utilizara.
	public void addService(String service_name, int num_parametros){
		ServerService new_server= new ServerService();
		new_server.setId(this.id);
		new_server.setParametros(num_parametros);
		new_server.setService(service_name);
		services.put(service_name, new_server);
	}
	
	public void deleteService(String service_name){
		services.remove(service_name);
	}
	
	// por si se queire añadir todos los servicios de frente(teniendo esa estructura de datos ya creada)
	public void getAllServices(Map<String,ServerService> services){
		this.services.putAll(services);
	}
	
	// aca antes de ver el resultado se verifica si hubo o no error
	public boolean getError(){
		return error;
	}
		
	// con este metodo se obtiene el resultado
	public int getResultado(){
		return this.resultado;
	}
	
	// aca se hace el proceso de ejecutar el servicio	
	public void procesar(int id, int []info){
		switch(id){
			case 0: {
				if(info.length!=2) error=true;
				else sumar(info[0],info[1]);
				break;
			}
			case 1: {
				if(info.length!=2) error=true;
				else multiplicar(info[0],info[1]);
				break;
			}
			case 2:{
				if(info.length!=2) error=true;
				else modulo(info[0], info[1]);
				break;
			}
			case 3:{
				if(info.length!=2) error=true;
				else potencia(info[0], info[1]);
				break;
			}
			case 4:{
				if(info.length!=2) error=true;
				else division_entera(info[0], info[1]);
				break;
			}
			case 5:{
				if(info.length!=1) error=true;
				else acumular(info[0]);
				break;
			}
		}
	}
	
	// La implementacion de los servicios BASICOS!
	private void sumar(int i, int j){
		resultado=i+j;
	}
	
	private void multiplicar(int i, int j){
		resultado=i*j;
	}
	
	private void modulo(int i, int j){
		resultado=i%j;
	}
	
	private void potencia(int i, int j){
		resultado=1;
		for(int k=0; k<j; k++){
			resultado*=i;
		}
	}
	
	private void division_entera(int i, int j){
		resultado=i/j;
	}
	
	private void acumular(int i){
		resultado=i+1;
	}
}